home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1999 March / EnigmA AMIGA RUN 35 (1999)(G.R. Edizioni)(IT)[!][issue 1999-03].iso / earcd / devel / vbcc-68k-src / machines / amiga68k / libsrc / amigalib / liballocpooled.c < prev    next >
C/C++ Source or Header  |  1999-01-01  |  2KB  |  63 lines

  1. #include "pool.h"
  2.  
  3. APTR LibAllocPooled(POOL *poolHeader, ULONG memSize)
  4. {
  5.   if (SysBase->LibNode.lib_Version>=39)
  6.     return (AllocPooled(poolHeader,memSize));
  7.   else {
  8.  
  9.     ULONG *puddle=NULL;
  10.  
  11.     if (poolHeader!=NULL && memSize!=0) {
  12.  
  13.       ULONG *p,size;
  14.  
  15.       if (poolHeader->ThreshSize>memSize) {
  16.  
  17.         struct MemHeader *a=(struct MemHeader *)poolHeader->PuddleList.mlh_Head;
  18.  
  19.         for(;;) {
  20.           if (a->mh_Node.ln_Succ!=NULL) {
  21.             if (a->mh_Node.ln_Type && (puddle=(ULONG *)Allocate(a,memSize))!=NULL)
  22.               break;
  23.             a=(struct MemHeader *)a->mh_Node.ln_Succ; continue;
  24.           }
  25.  
  26.           size=poolHeader->PuddleSize+sizeof(struct MemHeader)+2*sizeof(ULONG);
  27.           if ((puddle=(ULONG *)AllocMem(size,poolHeader->MemoryFlags))==NULL)
  28.             goto out; /* why is gcc so dumb ??? */
  29.  
  30.           *puddle++=size;
  31.           a=(struct MemHeader *)puddle;
  32.           a->mh_Node.ln_Type=NT_MEMORY;
  33.           a->mh_Lower=a->mh_First=(struct MemChunk *)((UBYTE *)a+sizeof(struct MemHeader)+sizeof(UBYTE *));
  34.           a->mh_First->mc_Next=NULL;
  35.           a->mh_Free=a->mh_First->mc_Bytes=poolHeader->PuddleSize;
  36.           a->mh_Upper=(char *)a->mh_First+a->mh_Free;
  37.           AddHead((struct List *)&poolHeader->PuddleList,&a->mh_Node);
  38.           puddle=(ULONG *)Allocate(a,memSize);
  39.           break;
  40.         }
  41.  
  42.         if (poolHeader->MemoryFlags&MEMF_CLEAR) {
  43.           p=puddle; memSize+=7; memSize>>=3;
  44.           do { *p++=0; *p++=0; } while(--memSize);
  45.         }
  46.       }
  47.       else {
  48.  
  49.         size=memSize+sizeof(struct MinNode)+2*sizeof(ULONG);
  50.  
  51.         if ((puddle=(ULONG *)AllocMem(size,poolHeader->MemoryFlags))!=NULL) {
  52.           *puddle++=size;
  53.           AddTail((struct List *)&poolHeader->PuddleList,(struct Node *)puddle);
  54.           puddle=(ULONG *)((struct MinNode *)puddle+1);
  55.           *puddle++=0;
  56.         }
  57.       }
  58.     }
  59. out:
  60.     return puddle;
  61.   }
  62. }
  63.